#!/bin/bash

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 错误处理
die() {
    echo -e "${RED}[错误] $1${NC}" >&2
    read -p "按回车键退出..."
    exit 1
}

# 获取本机IP地址
get_local_ip() {
    ip -o -4 addr show | awk '{print $4}' | cut -d'/' -f1 | grep -v '127.0.0.1' | head -n1
}

# 精准系统检测
detect_system() {
    # 检测群辉DSM
    if [ -f /etc/synoinfo.conf ] && [ -d /var/packages ]; then
        echo "dsm"
        return
    fi

    # 检测FNOS系统
    if grep -q "ID=debian" /etc/os-release && ls /vol1* &>/dev/null; then
        echo "fnos"
        return
    fi

    # 检测其他Debian系统
    if grep -q "ID=debian" /etc/os-release; then
        echo "debian"
        return
    fi

    # 其他Linux系统
    if [ -f /etc/os-release ]; then
        echo "linux"
        return
    fi

    echo "unknown"
}

# 获取Docker目录
get_docker_dir() {
    local system_type=$1
    local dir=""

    case $system_type in
        "dsm")
            # 查找现有的 docker 目录，找到就用第一个
            dir=$(find /volume* -maxdepth 1 -type d -name "docker" 2>/dev/null | head -n1)
            # 如果没找到，就使用默认路径 /volume1/docker
            [ -z "$dir" ] && dir="/volume1/docker"
            ;;
        "fnos")
            # 查找现有的 docker 目录，找到就用第一个
            dir=$(find /vol*/1000 -maxdepth 1 -type d -name "docker" 2>/dev/null | head -n1)
            # 如果没找到，就使用默认路径 /vol1/1000/docker
            [ -z "$dir" ] && dir="/vol1/1000/docker"
            ;;
        *)
            # 其他系统直接使用 /opt/docker
            dir="/opt/docker"
            ;;
    esac

    # 清理路径中的特殊字符
    dir=$(echo "$dir" | tr -d '\n\r')
    
    # 创建目录（如果不存在）
    mkdir -p "$dir" || die "无法创建目录 $dir"
    
    echo "$dir"
}

# 获取映射端口
get_mapped_port() {
    local default_port=$1
    local port_name=$2
    
    while true; do
        read -p "请输入${port_name}端口(默认${default_port}): " port
        port=${port:-$default_port}
        
        # 检查端口是否为数字
        if ! [[ "$port" =~ ^[0-9]+$ ]]; then
            echo -e "${RED}错误: 端口必须是数字${NC}"
            continue
        fi
        
        # 检查端口范围
        if [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
            echo -e "${RED}错误: 端口必须在1-65535之间${NC}"
            continue
        fi
        
        # 检查端口是否被占用
        if ss -tuln | grep -q ":$port "; then
            echo -e "${YELLOW}警告: 端口 $port 已被占用${NC}"
            read -p "是否继续使用此端口？(y/n) [n]: " choice
            if [[ ! "$choice" =~ ^[Yy]$ ]]; then
                continue
            fi
        fi
        
        break
    done
    
    echo "$port"
}

# 安装OnlyOffice
install_onlyoffice() {
    local base_dir="$1"
    local onlyoffice_dir="${base_dir}/onlyoffice"
    local http_port=$(get_mapped_port 9080 "HTTP")
    local https_port=$(get_mapped_port 9443 "HTTPS")
    
    # 创建必要的目录结构
    local cache_dir="${onlyoffice_dir}/cache"
    local database_dir="${onlyoffice_dir}/database"
    local log_dir="${onlyoffice_dir}/log"
    local data_dir="${onlyoffice_dir}/data"
    
    mkdir -p "$cache_dir" "$database_dir" "$log_dir" "$data_dir" || die "无法创建OnlyOffice目录结构"
    chmod -R 777 "$cache_dir" "$database_dir" "$log_dir" "$data_dir" || echo -e "${YELLOW}[警告] 无法设置目录权限${NC}"
    
    echo -e "${BLUE}[信息] 使用Docker目录: ${base_dir}${NC}"
    echo -e "${BLUE}[信息] 缓存目录: ${cache_dir}${NC}"
    echo -e "${BLUE}[信息] 数据库目录: ${database_dir}${NC}"
    echo -e "${BLUE}[信息] 日志目录: ${log_dir}${NC}"
    echo -e "${BLUE}[信息] 数据目录: ${data_dir}${NC}"
    echo -e "${BLUE}[信息] 使用HTTP端口: ${http_port}${NC}"
    echo -e "${BLUE}[信息] 使用HTTPS端口: ${https_port}${NC}"
    echo -e "${BLUE}[信息] JWT密钥: E264047E96CE4AA487EC1E0756C0F63F${NC}"

    # 清理旧容器
    if docker ps -aq --filter "name=onlyoffice"; then
        echo -e "${YELLOW}[注意] 移除已存在的onlyoffice容器...${NC}"
        docker stop onlyoffice >/dev/null 2>&1
        docker rm onlyoffice >/dev/null 2>&1
    fi

    # 运行新容器
    echo -e "${BLUE}[信息] 正在启动OnlyOffice容器...${NC}"
    if ! docker run -d \
        --name onlyoffice \
        --restart=always \
        -p ${http_port}:80 \
        -p ${https_port}:443 \
        -v "${cache_dir}:/var/lib/onlyoffice" \
        -v "${database_dir}:/var/lib/postgresql" \
        -v "${log_dir}:/var/log/onlyoffice" \
        -v "${data_dir}:/var/www/onlyoffice/Data" \
        -e JWT_SECRET=E264047E96CE4AA487EC1E0756C0F63F \
        onlyoffice/documentserver:latest; then
        docker logs onlyoffice 2>&1 | head -n 20
        die "启动OnlyOffice容器失败，请检查上方日志"
    fi

    # 配置OnlyOffice
    echo -e "${BLUE}[信息] 正在配置OnlyOffice...${NC}"
    docker exec onlyoffice supervisorctl start ds:example || echo -e "${YELLOW}[警告] 启动ds:example服务失败${NC}"
    docker exec onlyoffice sed 's,autostart=false,autostart=true,' -i /etc/supervisor/conf.d/ds-example.conf || echo -e "${YELLOW}[警告] 修改自动启动配置失败${NC}"

    # 验证容器状态
    sleep 5  # OnlyOffice启动需要更多时间
    if ! docker ps --filter "name=onlyoffice" --format "{{.Status}}" | grep -q "Up"; then
        docker logs onlyoffice 2>&1 | head -n 50  # 显示更多日志以便排查启动问题
        die "容器启动后异常退出，请检查上方日志"
    fi

    local ip=$(get_local_ip)
    echo -e "\n${GREEN}========== 安装成功 ==========${NC}"
    echo -e "HTTP访问地址: ${GREEN}http://${ip}:${http_port}${NC}"
    echo -e "HTTPS访问地址: ${GREEN}https://${ip}:${https_port}${NC}"
    echo -e "缓存目录: ${cache_dir}"
    echo -e "数据库目录: ${database_dir}"
    echo -e "日志目录: ${log_dir}"
    echo -e "数据目录: ${data_dir}"
    echo -e "查看日志: ${YELLOW}docker logs onlyoffice${NC}"
    echo -e "${YELLOW}注意: 首次启动可能需要较长时间初始化数据库${NC}"
}

# 主流程
main() {
    echo -e "${BLUE}=== OnlyOffice自动化安装脚本 ===${NC}"
    
    # 检查Docker
    if ! command -v docker &>/dev/null; then
        die "Docker未安装，请先安装Docker"
    fi
    echo -e "${GREEN}[成功] Docker已安装: $(docker --version | cut -d ',' -f 1)${NC}"

    # 检测系统并获取目录
    system_type=$(detect_system)
    case $system_type in
        "dsm") echo -e "${GREEN}[系统] 检测到群辉DSM${NC}" ;;
        "fnos") echo -e "${GREEN}[系统] 检测到FNOS${NC}" ;;
        "debian") echo -e "${YELLOW}[系统] 检测到Debian${NC}" ;;
        "linux") echo -e "${YELLOW}[系统] 检测到通用Linux${NC}" ;;
        *) echo -e "${YELLOW}[警告] 系统类型未知，使用默认配置${NC}" ;;
    esac

    dir=$(get_docker_dir "$system_type")
    echo -e "${BLUE}[目录] 使用容器目录: ${dir}${NC}"

    # 安装OnlyOffice
    install_onlyoffice "$dir"

    read -p "按回车键退出..."
}

main "$@"